NOTEBOOK - Stéphane Srsa

PROJET 9

Produire une étude de marché avec Python

Crazy Chicken

SOMMAIRE - Partie II

  • 1 - Importation des librairies et des fonctions

  • 1.1 - Importation des librairies

  • 1.2 - Importation des éléments de la librairie 'geopandas'

  • 1.3 - Importation des fonctions

  • 2 - Chargement des fichiers et choix de l'année d'analyse

  • 2.1 - Choix de l'année et calcul du taux de croissance

  • 2.2 - Confirmation des indicateurs à conserver dans le dataset

  • 3 - Matrice de corrélation - Filtrage des indicateurs

  • 3.1 - Filtrage des indicateurs trop corrélés entre eux

  • 3.2 - Matrice de corrélations

  • 3.3 - Attribution des noms de colonne

  • 4 - Clusterisation CAH et Kmeans selon différentes méthodes de prétraitement des données

  • 5 - Analyse en composantes principales (PCA)

  • 6 - Résultats et recommandations

  • 7 - Analyse ciblée/adaptée à la mission

  • 7.1 - Choix des indicateurs

  • 7.2 - Choix du prétraitement et clustering CAH et K-means

  • 7.3 - Analyse en composantes principales

  • 7.4 - Résultats et recommandations

1 - Importation des librairies et des fonctions
1.1 - Importation des librairies
In [4]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display, HTML
from tabulate import tabulate

# Pour palier aux avertissements à l'utilisation de Seaborn (entre autres)
import warnings
warnings.filterwarnings("ignore")
1.2 - Importation des éléments de la librairie 'geopandas'
In [6]:
from mpl_toolkits.axes_grid1 import make_axes_locatable
import plotly.express as px
import geopandas as gpd
from cartopy import crs as ccrs
from descartes import PolygonPatch
import folium
import requests
1.3 - Importation des fonctions
In [8]:
from P9_FonctionsCopie import *
2 - Sélection de l'année sur laquelle nous portons l'étude
2.1 - Chargement du fichier nettoyé et préparé
In [11]:
# Choix de l'année (de 2010 à 2019)
année = 2019
# Période de lissage de la croissance (Calcul taux de croissance population)
Debut_period = année - 4
In [12]:
# Chargement des données et réduction sur l'année choisie
DF_F = pd.read_csv('DF_VOLAILLE.csv')
#DF_F = DF_F.drop('%Croiss_Pop',axis=1)

if année < 2010 or année > 2019 or isinstance(année, float):
    Tmessage('Année non disponible !')
else:
    # Taux de croissance de la population de puis Debut_period
    Pop_Evol = pd.read_csv('Pop_Evol_NP.csv')
    TCCP = Pop_Evol.pivot(index='Pays', columns='Année', values='Pop(Million)')
    TCCP['%Croiss_Pop'] = round((((TCCP[année] - TCCP[Debut_period])  / TCCP[Debut_period]) *100),2)
    TCCP = TCCP.reset_index()
    # Mise en conformité des Pays
    Concordance_pays = {"Royaume-Uni de Grande-Bretagne et d'Irlande du Nord": 'Royaume-Uni', 'Tchéquie':'République Tchèque'}
    TCCP['Pays'] = TCCP['Pays'].replace(Concordance_pays)
    DF_F = DF_F.reset_index()
    DF_F = pd.merge(DF_F,TCCP[['Pays','%Croiss_Pop']], on='Pays', how='left')
    DF_F['Pays'] = DF_F['Pays'].replace({'Pays-Bas (Royaume des)':'Pays-Bas'})
    # Réduction des tables à l'année choisie
    DF_F = DF_F.loc[DF_F['Année'] == année]
    DF_F = DF_F.set_index('Pays')
    DF_F = DF_F.drop(columns=['Année','index']) 
    infos_DF(DF_F)
Information du Fichier
Disponibilité alimentaire (Kcal) Disponibilité alimentaire (Kcal/personne/jour) Disponibilité alimentaire en quantité (kg/personne/an) Disponibilité de matière grasse en quantité (g/personne/jour) Disponibilité de matière grasse en quantité (t) Disponibilité de protéines en quantité (g/personne/jour) Disponibilité de protéines en quantité (t) Disponibilité intérieure / Milliers de tonnes Exportations - Quantité / Milliers de tonnes Importations - Quantité / Milliers de tonnes ... Pop(Million) PIB / Croissance annuelle US$ par habitant % PIB / Croissance annuelle US$ % PIB / Valeur US $ par habitant USD PIB / Valeur US $ Millions d’USD Indice Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Afghanistan 94490.39 6.85 1.81 0.40 5471.99 0.82 11286.68 69.0 6.0 44.0 ... 37.769499 -0.305564 2.636658 500.522664 18904.49026 -2.652407 10.0 56.3 0.18 11.90
Afrique du Sud 2996329.90 141.32 37.50 8.16 173077.05 16.94 359134.38 2178.0 49.0 488.0 ... 58.087055 -5.053596 -3.815973 6688.774747 388531.22660 -0.283250 36.0 79.7 0.45 3.96
Albanie 49226.46 46.93 12.34 2.67 2801.40 5.65 5931.04 35.0 0.0 22.0 ... 2.873883 1.729697 1.619022 5359.239078 15401.82608 0.110050 60.0 113.0 0.53 -0.30

3 rows × 26 columns

le fichier contient 182 lignes et 26 colonnes
<class 'pandas.core.frame.DataFrame'>
Index: 182 entries, Afghanistan to Îles Salomon
Data columns (total 26 columns):
 #   Column                                                         Non-Null Count  Dtype  
---  ------                                                         --------------  -----  
 0   Disponibilité alimentaire (Kcal)                               182 non-null    float64
 1   Disponibilité alimentaire (Kcal/personne/jour)                 182 non-null    float64
 2   Disponibilité alimentaire en quantité (kg/personne/an)         182 non-null    float64
 3   Disponibilité de matière grasse en quantité (g/personne/jour)  182 non-null    float64
 4   Disponibilité de matière grasse en quantité (t)                182 non-null    float64
 5   Disponibilité de protéines en quantité (g/personne/jour)       182 non-null    float64
 6   Disponibilité de protéines en quantité (t)                     182 non-null    float64
 7   Disponibilité intérieure / Milliers de tonnes                  182 non-null    float64
 8   Exportations - Quantité / Milliers de tonnes                   182 non-null    float64
 9   Importations - Quantité / Milliers de tonnes                   182 non-null    float64
 10  Nourriture / Milliers de tonnes                                182 non-null    float64
 11  Production / Milliers de tonnes                                182 non-null    float64
 12  Résidus / Milliers de tonnes                                   182 non-null    float64
 13  %import                                                        182 non-null    float64
 14  %export                                                        182 non-null    float64
 15  %prod                                                          182 non-null    float64
 16  Pop(Million)                                                   182 non-null    float64
 17  PIB / Croissance annuelle US$ par habitant %                   182 non-null    float64
 18  PIB / Croissance annuelle US$ %                                182 non-null    float64
 19  PIB / Valeur US $ par habitant USD                             182 non-null    float64
 20  PIB / Valeur US $ Millions d’USD                               182 non-null    float64
 21  Indice Stabilité politique                                     182 non-null    float64
 22  Moy_Prot_Animale                                               182 non-null    float64
 23  Moy_Prot                                                       182 non-null    float64
 24  %Prot_animale                                                  182 non-null    float64
 25  %Croiss_Pop                                                    182 non-null    float64
dtypes: float64(26)
memory usage: 38.4+ KB
Valeurs manquantes
Disponibilité alimentaire (Kcal)                                 0
Disponibilité alimentaire (Kcal/personne/jour)                   0
Disponibilité alimentaire en quantité (kg/personne/an)           0
Disponibilité de matière grasse en quantité (g/personne/jour)    0
Disponibilité de matière grasse en quantité (t)                  0
Disponibilité de protéines en quantité (g/personne/jour)         0
Disponibilité de protéines en quantité (t)                       0
Disponibilité intérieure / Milliers de tonnes                    0
Exportations - Quantité / Milliers de tonnes                     0
Importations - Quantité / Milliers de tonnes                     0
Nourriture / Milliers de tonnes                                  0
Production / Milliers de tonnes                                  0
Résidus / Milliers de tonnes                                     0
%import                                                          0
%export                                                          0
%prod                                                            0
Pop(Million)                                                     0
PIB / Croissance annuelle US$ par habitant %                     0
PIB / Croissance annuelle US$ %                                  0
PIB / Valeur US $ par habitant USD                               0
PIB / Valeur US $ Millions d’USD                                 0
Indice Stabilité politique                                       0
Moy_Prot_Animale                                                 0
Moy_Prot                                                         0
%Prot_animale                                                    0
%Croiss_Pop                                                      0
dtype: int64
Valeurs uniques
Disponibilité alimentaire (Kcal)                                 182
Disponibilité alimentaire (Kcal/personne/jour)                   182
Disponibilité alimentaire en quantité (kg/personne/an)           181
Disponibilité de matière grasse en quantité (g/personne/jour)    169
Disponibilité de matière grasse en quantité (t)                  182
Disponibilité de protéines en quantité (g/personne/jour)         175
Disponibilité de protéines en quantité (t)                       182
Disponibilité intérieure / Milliers de tonnes                    136
Exportations - Quantité / Milliers de tonnes                      62
Importations - Quantité / Milliers de tonnes                      93
Nourriture / Milliers de tonnes                                  137
Production / Milliers de tonnes                                  126
Résidus / Milliers de tonnes                                       5
%import                                                          143
%export                                                           94
%prod                                                            153
Pop(Million)                                                     182
PIB / Croissance annuelle US$ par habitant %                     182
PIB / Croissance annuelle US$ %                                  182
PIB / Valeur US $ par habitant USD                               182
PIB / Valeur US $ Millions d’USD                                 182
Indice Stabilité politique                                       180
Moy_Prot_Animale                                                 133
Moy_Prot                                                         142
%Prot_animale                                                     60
%Croiss_Pop                                                      174
dtype: int64
2.2 - Confirmation des indicateurs à conserver dans le dataset
In [14]:
#Verif_col(DF_F)
In [15]:
# Suppression des colonnes non suffisamment renseignées
DF_F = DF_F.drop(columns=['Résidus / Milliers de tonnes','Exportations - Quantité / Milliers de tonnes','%export'], axis=1)


#--------- Vérification des valeurs = 0 -----------------
# Préparation des données
Prod = DF_F.loc[DF_F['%import'] == 0]['%prod']
Prod = Prod.reset_index()
Imp = DF_F.loc[DF_F['%prod'] == 0]['%import']
Imp = Imp.reset_index()
# Création des sous-graphiques
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# Sous-graphique 1 : Les pays qui n'importent pas
ax1.axis('off')  # Supprime les axes
message1 = "Les pays avec %import = 0"
ax1.text(0.5, 2.8, message1, ha='center', fontsize=14, fontweight='bold', color = 'teal')
table1 = ax1.table(cellText=Prod.values, colLabels=Prod.columns, loc='top',
                   cellLoc='center', cellColours=[['lightgray', 'whitesmoke']]*len(Prod),
                   bbox=[0, 0.7, 1, 2])
table1.auto_set_font_size(False)  # Désactive la taille de police automatique
table1.set_fontsize(11)  # Définit la taille de police
ax1.text(1.1, 0.5, "Vérification terminée : tout est cohérent", ha='center', fontsize=14, fontweight='bold', color = 'firebrick')
# Sous-graphique 2 : Les pays qui importent
ax2.axis('off')  # Supprime les axes
message2 = "Les pays avec %prod = 0"
ax2.text(0.5, 2.8, message2, ha='center', fontsize=14, fontweight='bold', color = 'teal')
table2 = ax2.table(cellText=Imp.values, colLabels=Imp.columns, loc='top',
                   cellLoc='center', cellColours=[['lightgray', 'whitesmoke']]*len(Imp),
                   bbox=[0, 0.7, 1, 2])
table2.auto_set_font_size(False)  # Désactive la taille de police automatique
table2.set_fontsize(11)  # Définit la taille de police

plt.tight_layout()
plt.show()
No description has been provided for this image
3 - Matrice de corrélation - Filtrage des indicateurs
3.1 - Filtrage des indicateurs trop corrélés entre eux
In [18]:
# Trier l'index par ordre décroissant
DF_F = DF_F.sort_index(ascending=True)
# Liste des colonnes
colonnes = DF_F.columns
# Liste des colonnes à supprimer
colonnes_a_supprimer = []

# Boucle pour calculer la corrélation entre chaque paire de colonnes
for i in range(len(colonnes)):
    for j in range(i+1, len(colonnes)):
        col1 = colonnes[i]
        col2 = colonnes[j]
        correlation = DF_F[col1].corr(DF_F[col2])
        if correlation >= 0.985:
            # Ajouter la colonne à la liste des colonnes à supprimer
            colonnes_a_supprimer.append(col2)

# Supprimer les colonnes trop fortement corrélées (indicateurs similaires)
DF_F = DF_F.drop(columns=colonnes_a_supprimer, axis=1)

# Affichage
DF_F.head(1)
Out[18]:
Disponibilité alimentaire (Kcal) Disponibilité alimentaire (Kcal/personne/jour) Importations - Quantité / Milliers de tonnes %import %prod Pop(Million) PIB / Croissance annuelle US$ par habitant % PIB / Valeur US $ par habitant USD PIB / Valeur US $ Millions d’USD Indice Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Afghanistan 94490.39 6.85 44.0 63.77 40.58 37.769499 -0.305564 500.522664 18904.49026 -2.652407 10.0 56.3 0.18 11.9
3.2 - Matrice de corrélations
In [20]:
# Calculate pairwise-correlation
matrix = DF_F.corr(method='pearson')

# Triangle de corrélations
mask1 = np.tril(np.ones_like(matrix, dtype=bool))
mask2 = np.eye(matrix.shape[0], dtype=bool)
mask = mask1 | mask2
# affichage
message = "corrélation entre les indicateurs"
Tmessage(message)
plt.figure(figsize=(12, 5))
sns.heatmap(matrix, mask=~mask, annot=True, cmap='seismic')
plt.show()
message = "Le dataset contient {:.0f} indicateurs pour {} Pays ".format(DF_F.shape[1],DF_F.shape[0])
Text_message(message)
#DF_F.corr(method='pearson')
corrélation entre les indicateurs
No description has been provided for this image
Le dataset contient 14 indicateurs pour 182 Pays
3.3 - Attribution des noms de colonne
In [22]:
# On Renomme les colonnes
variable = DF_F.columns 
New_name = ['Dispo Alim','Dispo Alim (p/j)','Importation Qté', 'TDI','TAS', 'Pop(Million)', 'PiB croiss.Hab %', 
            'PIB Valeur Hab', 'PIB Valeur', 'Stabilité politique']
#New_name = ['Dispo Alim(Kcal)','Dispo Alim (p/j)','Importation Qté','Production', 'TDI','TAS', 'Pop(Million)', '%Croiss_Pop', 
#            'PiB croiss.Hab %', 'PiB croiss %', 'PIB Valeur Hab', 'PIB Valeur', 'Stabilité politique']

# Dictionnaire de correspondance entre les anciens noms et les nouveaux noms
column_mapping = {ancien: nouveau for ancien, nouveau in zip(variable, New_name)}

# On renomme les colonnes
DF_F = DF_F.rename(columns=column_mapping)
DF_F.head(2)
Out[22]:
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Afghanistan 94490.39 6.85 44.0 63.77 40.58 37.769499 -0.305564 500.522664 18904.49026 -2.652407 10.0 56.3 0.18 11.90
Afrique du Sud 2996329.90 141.32 488.0 22.41 83.38 58.087055 -5.053596 6688.774747 388531.22660 -0.283250 36.0 79.7 0.45 3.96
4 - Clusterisation CAH et Kmeans selon différentes méthodes de prétraitement

Le but est de trouver un prétraitement permettant d'obtenir des groupes homogènes et de minimiser l'impact des outliers. Pour cela et malgré le nombre de clusters conseillés, j'ai choisi d'imposer 5 clusters.¶

StandardScaler

In [26]:
# CAH(DF, scaler) 
#CAH(DF_F, preprocessing.StandardScaler())
print('-------------------------------------------------------------------------------------------------------------------------')
# Kmeans(DF, scaler) 
Kmeans(DF_F, preprocessing.StandardScaler())
-------------------------------------------------------------------------------------------------------------------------
K-Means
Prétraitement appliqué: StandardScaler()
Méthode du coude et Scores de silhouette pour le choix du nombre de clusters
No description has been provided for this image
Nombre optimal de clusters conseillé: 4
In [27]:
# CAH_groupes(DF, scaler, nombre de clusters, Seuil_Outliers)
CAH_groupes(DF_F, preprocessing.StandardScaler(), 5, 6)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Centroides(DF, scaler, nombre de clusters, Seuil_Outliers)
Kmeans_Centroides(DF_F, preprocessing.StandardScaler(), 5, 6)
Prétraitement appliqué: StandardScaler()
Classification ascendante hiérarchique -: 5 clusters
No description has been provided for this image
Liste de Outliers
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Chine, continentale 33788758.93 65.11 795.0 3.83 100.11 1421.864031 2.424684 10043.130179 1.427997e+07 -0.259811 40.7 105.3 0.39 2.02
Inde 6054757.47 11.99 0.0 0.00 100.11 1383.112050 2.115564 2061.100834 2.850733e+06 -0.796841 15.3 65.7 0.23 4.55
Pays-Bas 126988.92 20.04 602.0 373.91 650.93 17.363262 -0.863965 52420.699958 9.101943e+05 0.821221 67.3 107.3 0.63 1.89
Yémen 454767.27 39.50 140.0 42.42 57.58 31.546691 -52.499717 411.460367 1.298021e+04 -2.770874 10.7 53.0 0.20 10.63
États-Unis d'Amérique 25967507.67 212.80 123.0 0.64 119.00 334.319671 3.450642 63953.688205 2.138098e+07 0.117877 75.3 116.3 0.65 2.99
-----------------------------------------------------------------------------------------------------------------------
Prétraitement appliqué: StandardScaler()
No description has been provided for this image
Cluster 0: 53 Pays
Cluster 1: 78 Pays
Cluster 2: 10 Pays
Cluster 3: 2 Pays
Cluster 4: 39 Pays
Liste de Outliers
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Chine, continentale 33788758.93 65.11 795.0 3.83 100.11 1421.864031 2.424684 10043.130179 1.427997e+07 -0.259811 40.7 105.3 0.39 2.02
Inde 6054757.47 11.99 0.0 0.00 100.11 1383.112050 2.115564 2061.100834 2.850733e+06 -0.796841 15.3 65.7 0.23 4.55
Pays-Bas 126988.92 20.04 602.0 373.91 650.93 17.363262 -0.863965 52420.699958 9.101943e+05 0.821221 67.3 107.3 0.63 1.89
Yémen 454767.27 39.50 140.0 42.42 57.58 31.546691 -52.499717 411.460367 1.298021e+04 -2.770874 10.7 53.0 0.20 10.63
États-Unis d'Amérique 25967507.67 212.80 123.0 0.64 119.00 334.319671 3.450642 63953.688205 2.138098e+07 0.117877 75.3 116.3 0.65 2.99
In [28]:
# CAH_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats CAH
Data_Scaler_CAH = CAH_Stats(DF_F, preprocessing.StandardScaler(), 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats Kmeans
Data_Scaler_Kmeans = Kmeans_Stats(DF_F, preprocessing.StandardScaler(), 5)
Prétraitement appliqué: StandardScaler()
Statistiques (moyennes) des clusters - CAH
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
cluster
1 -0.139243 -0.712892 -0.291384 -0.269454 0.005114 0.049695 0.003989 -0.598599 -0.176023 -0.659829 -0.836334 -0.665342 -0.868800 0.512164 1.0
2 8.471785 0.807409 1.902109 -0.867561 0.573956 5.526791 0.387881 1.135431 8.753408 0.048381 0.996774 1.384290 0.547093 -0.548553 2.0
3 -0.096923 0.669807 -0.159426 0.219474 -0.164544 -0.187773 0.071099 0.031906 -0.137850 0.513949 0.535616 0.350194 0.690818 -0.531064 3.0
4 0.088166 0.540038 1.288705 0.091606 0.027238 -0.077434 -0.263684 1.931726 0.305344 0.804720 1.287831 1.204410 0.977321 -0.176411 4.0
5 -0.254164 -0.996172 2.642471 6.949159 9.473546 -0.164791 -0.098098 1.914996 0.219544 0.989753 1.445960 1.220299 1.227391 -0.673840 5.0
Tendance des indicateurs par clusters - CAH
No description has been provided for this image
Imputation des clusters par pays - CAH
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
Pays
Afghanistan -0.263696 -1.196225 -0.246493 0.426585 -0.559915 -0.029854 -0.026715 -0.709459 -0.229984 -2.675368 -1.321602 -1.169274 -1.555647 1.365387 1
Afrique du Sud 0.587408 0.843279 2.052252 -0.443260 0.143668 0.104496 -0.633677 -0.396656 -0.043560 -0.175605 -0.065815 -0.072882 0.114176 -0.252141 4
Albanie -0.276972 -0.588332 -0.360395 0.407447 -0.616465 -0.260602 0.233461 -0.463861 -0.231751 0.239376 1.093373 1.487369 0.608938 -1.119984 3
Répartition des pays par cluster - CAH
Cluster 1: Nombre de Pays 85
Index(['Afghanistan', 'Algérie', 'Angola', 'Azerbaïdjan', 'Bangladesh',
       'Belize', 'Bhoutan', 'Bolivie (État plurinational de)', 'Botswana',
       'Burkina Faso', 'Burundi', 'Bénin', 'Cabo Verde', 'Cambodge',
       'Cameroun', 'Comores', 'Côte d'Ivoire', 'Eswatini', 'Gambie', 'Ghana',
       'Guatemala', 'Guinée', 'Guinée-Bissau', 'Haïti', 'Honduras', 'Inde',
       'Indonésie', 'Iran (République islamique d')', 'Iraq', 'Jordanie',
       'Kenya', 'Kirghizistan', 'Lesotho', 'Liban', 'Libye', 'Libéria',
       'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Mauritanie', 'Mozambique',
       'Myanmar', 'Namibie', 'Nicaragua', 'Niger', 'Nigéria', 'Népal',
       'Ouganda', 'Ouzbékistan', 'Pakistan', 'Paraguay', 'Philippines',
       'Rwanda', 'République arabe syrienne', 'République centrafricaine',
       'République dominicaine', 'République démocratique du Congo',
       'République démocratique populaire lao', 'République-Unie de Tanzanie',
       'Sao Tomé-et-Principe', 'Sierra Leone', 'Soudan', 'Soudan du Sud',
       'Sri Lanka', 'Sénégal', 'Tadjikistan', 'Tchad', 'Thaïlande',
       'Timor-Leste', 'Togo', 'Tunisie', 'Turkménistan', 'Turquie', 'Ukraine',
       'Vanuatu', 'Venezuela (République bolivarienne du)', 'Viet Nam',
       'Yémen', 'Zambie', 'Zimbabwe', 'Égypte', 'Équateur', 'Éthiopie',
       'Îles Salomon'],
      dtype='object', name='Pays')
Cluster 2: Nombre de Pays 2
Index(['Chine, continentale', 'États-Unis d'Amérique'], dtype='object', name='Pays')
Cluster 3: Nombre de Pays 71
Index(['Albanie', 'Antigua-et-Barbuda', 'Argentine', 'Arménie', 'Bahamas',
       'Bahreïn', 'Barbade', 'Belgique', 'Bosnie-Herzégovine', 'Brésil',
       'Bulgarie', 'Bélarus', 'Chili', 'Chine, Taiwan Province de', 'Chypre',
       'Colombie', 'Congo', 'Costa Rica', 'Croatie', 'Cuba', 'Dominique',
       'El Salvador', 'Espagne', 'Estonie', 'Fidji', 'Fédération de Russie',
       'Gabon', 'Grenade', 'Grèce', 'Guyana', 'Géorgie', 'Hongrie', 'Italie',
       'Jamaïque', 'Kazakhstan', 'Kiribati', 'Koweït', 'Lettonie', 'Lituanie',
       'Macédoine du Nord', 'Malaisie', 'Malte', 'Maurice',
       'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
       'Nouvelle-Calédonie', 'Oman', 'Panama', 'Papouasie-Nouvelle-Guinée',
       'Pologne', 'Polynésie française', 'Portugal', 'Pérou', 'Qatar',
       'Roumanie', 'République Tchèque', 'République de Corée',
       'République de Moldova', 'Saint-Kitts-et-Nevis',
       'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa', 'Serbie',
       'Seychelles', 'Slovaquie', 'Slovénie', 'Suriname', 'Trinité-et-Tobago',
       'Uruguay'],
      dtype='object', name='Pays')
Cluster 4: Nombre de Pays 23
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Australie',
       'Autriche', 'Canada', 'Chine - RAS de Hong-Kong',
       'Chine - RAS de Macao', 'Danemark', 'Finlande', 'France', 'Irlande',
       'Islande', 'Israël', 'Japon', 'Luxembourg', 'Mexique', 'Norvège',
       'Nouvelle-Zélande', 'Royaume-Uni', 'Suisse', 'Suède',
       'Émirats arabes unis'],
      dtype='object', name='Pays')
Cluster 5: Nombre de Pays 1
Index(['Pays-Bas'], dtype='object', name='Pays')
-----------------------------------------------------------------------------------------------------------------------
Prétraitement appliqué: StandardScaler()
Statistiques (moyennes) des clusters - Kmeans
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
cluster
0 0.011035 0.504944 -0.119795 -0.285174 0.303206 -0.139285 -0.021159 0.700336 -0.047821 0.591185 0.984563 0.933692 0.832982 -0.561102 0.0
1 -0.132303 -0.739912 -0.279018 -0.360152 0.049937 0.074563 -0.029774 -0.602441 -0.170236 -0.781892 -0.870187 -0.688897 -0.913407 0.559757 1.0
2 0.319160 0.353401 3.423734 1.295820 1.071330 0.081843 -0.108930 1.276644 0.713534 0.399536 1.033965 0.959789 0.837766 -0.533274 2.0
3 8.471785 0.807409 1.902109 -0.867561 0.573956 5.526791 0.387881 1.135431 8.753408 0.048381 0.996774 1.384290 0.547093 -0.548553 3.0
4 -0.266677 0.661598 -0.254591 0.820076 -0.816058 -0.264253 0.096343 -0.132427 -0.226391 0.655452 0.086143 -0.208159 0.451946 -0.192123 4.0
Tendance des indicateurs par clusters - Kmeans
No description has been provided for this image
Imputation des clusters par pays - KMeans
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
Pays
Afghanistan -0.263696 -1.196225 -0.246493 0.426585 -0.559915 -0.029854 -0.026715 -0.709459 -0.229984 -2.675368 -1.321602 -1.169274 -1.555647 1.365387 1
Afrique du Sud 0.587408 0.843279 2.052252 -0.443260 0.143668 0.104496 -0.633677 -0.396656 -0.043560 -0.175605 -0.065815 -0.072882 0.114176 -0.252141 0
Albanie -0.276972 -0.588332 -0.360395 0.407447 -0.616465 -0.260602 0.233461 -0.463861 -0.231751 0.239376 1.093373 1.487369 0.608938 -1.119984 0
Répartition des pays par cluster - KMeans
Cluster 0: Nombre de Pays 53
Index(['Afrique du Sud', 'Albanie', 'Argentine', 'Australie', 'Autriche',
       'Barbade', 'Bosnie-Herzégovine', 'Brésil', 'Bélarus', 'Canada', 'Chili',
       'Chine - RAS de Macao', 'Chine, Taiwan Province de', 'Chypre',
       'Costa Rica', 'Croatie', 'Danemark', 'Espagne', 'Estonie', 'Finlande',
       'Fédération de Russie', 'Grèce', 'Guyana', 'Hongrie', 'Irlande',
       'Islande', 'Israël', 'Italie', 'Kazakhstan', 'Lettonie', 'Lituanie',
       'Luxembourg', 'Malaisie', 'Malte', 'Maurice', 'Monténégro', 'Myanmar',
       'Norvège', 'Nouvelle-Zélande', 'Panama', 'Pologne', 'Portugal', 'Pérou',
       'Roumanie', 'République Tchèque', 'République de Corée', 'Serbie',
       'Slovénie', 'Suisse', 'Suède', 'Trinité-et-Tobago', 'Ukraine',
       'Uruguay'],
      dtype='object', name='Pays')
Cluster 1: Nombre de Pays 78
Index(['Afghanistan', 'Algérie', 'Angola', 'Azerbaïdjan', 'Bangladesh',
       'Belize', 'Bolivie (État plurinational de)', 'Burkina Faso', 'Burundi',
       'Bénin', 'Cambodge', 'Cameroun', 'Colombie', 'Comores', 'Côte d'Ivoire',
       'El Salvador', 'Eswatini', 'Gambie', 'Ghana', 'Guatemala', 'Guinée',
       'Guinée-Bissau', 'Haïti', 'Honduras', 'Inde', 'Indonésie',
       'Iran (République islamique d')', 'Iraq', 'Jordanie', 'Kenya',
       'Lesotho', 'Liban', 'Libye', 'Libéria', 'Madagascar', 'Malawi', 'Mali',
       'Maroc', 'Mauritanie', 'Mozambique', 'Nicaragua', 'Niger', 'Nigéria',
       'Népal', 'Ouganda', 'Ouzbékistan', 'Pakistan',
       'Papouasie-Nouvelle-Guinée', 'Paraguay', 'Philippines', 'Rwanda',
       'République arabe syrienne', 'République centrafricaine',
       'République démocratique du Congo',
       'République démocratique populaire lao', 'République-Unie de Tanzanie',
       'Sierra Leone', 'Soudan', 'Soudan du Sud', 'Sri Lanka', 'Sénégal',
       'Tadjikistan', 'Tchad', 'Thaïlande', 'Timor-Leste', 'Togo', 'Tunisie',
       'Turkménistan', 'Turquie', 'Venezuela (République bolivarienne du)',
       'Viet Nam', 'Yémen', 'Zambie', 'Zimbabwe', 'Égypte', 'Équateur',
       'Éthiopie', 'Îles Salomon'],
      dtype='object', name='Pays')
Cluster 2: Nombre de Pays 10
Index(['Allemagne', 'Arabie saoudite', 'Belgique', 'Chine - RAS de Hong-Kong',
       'France', 'Japon', 'Mexique', 'Pays-Bas', 'Royaume-Uni',
       'Émirats arabes unis'],
      dtype='object', name='Pays')
Cluster 3: Nombre de Pays 2
Index(['Chine, continentale', 'États-Unis d'Amérique'], dtype='object', name='Pays')
Cluster 4: Nombre de Pays 39
Index(['Antigua-et-Barbuda', 'Arménie', 'Bahamas', 'Bahreïn', 'Bhoutan',
       'Botswana', 'Bulgarie', 'Cabo Verde', 'Congo', 'Cuba', 'Dominique',
       'Fidji', 'Gabon', 'Grenade', 'Géorgie', 'Jamaïque', 'Kirghizistan',
       'Kiribati', 'Koweït', 'Macédoine du Nord',
       'Micronésie (États fédérés de)', 'Mongolie', 'Namibie', 'Nauru',
       'Nouvelle-Calédonie', 'Oman', 'Polynésie française', 'Qatar',
       'République de Moldova', 'République dominicaine',
       'Saint-Kitts-et-Nevis', 'Saint-Vincent-et-les Grenadines',
       'Sainte-Lucie', 'Samoa', 'Sao Tomé-et-Principe', 'Seychelles',
       'Slovaquie', 'Suriname', 'Vanuatu'],
      dtype='object', name='Pays')

Transformation Logarithmique

In [30]:
# CAH(DF, scaler)
CAH(DF_F,'Log')
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans(DF, scaler)
Kmeans(DF_F,'Log')
Prétraitement appliqué: Transformation logarithmique
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Afghanistan 11.456264 2.060514 3.806662 4.170843 3.727619 3.657634 0.095310 6.217649 9.847208 0.095310 2.397895 4.048301 0.165514 2.557227
Afrique du Sud 14.912899 4.958078 6.192362 3.153163 4.435330 4.079012 0.095310 8.808335 12.870131 0.095310 3.610918 4.390739 0.371564 1.601406
Albanie 10.804207 3.869742 3.135494 4.156693 3.641264 1.354257 1.004191 8.586764 9.642306 0.104405 4.110874 4.736198 0.425268 0.095310
CLASSIFICATION ASCENDANTE HIERARCHIQUE
No description has been provided for this image
Score de silhouette moyen pour chaque nombre de clusters - CAH
No description has been provided for this image
Nombre optimal de clusters conseillé : 2
-----------------------------------------------------------------------------------------------------------------------
K-Means
Prétraitement appliqué: Transformation logarithmique
Méthode du coude et Scores de silhouette pour le choix du nombre de clusters
No description has been provided for this image
Nombre optimal de clusters conseillé: 3
In [31]:
# CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)
CAH_groupes(DF_F,'Log', 5, 3.2)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)
Kmeans_Centroides(DF_F,'Log', 5, 3.2)
Prétraitement appliqué: Transformation logarithmique
Classification ascendante hiérarchique -: 5 clusters
No description has been provided for this image
Liste de Outliers
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Burundi 9068.87 2.09 0.0 0.00 100.00 11.874838 -1.717280 283.669870 3.368534e+03 -1.624993 2.3 41.0 0.06 10.70
Chine, continentale 33788758.93 65.11 795.0 3.83 100.11 1421.864031 2.424684 10043.130179 1.427997e+07 -0.259811 40.7 105.3 0.39 2.02
Inde 6054757.47 11.99 0.0 0.00 100.11 1383.112050 2.115564 2061.100834 2.850733e+06 -0.796841 15.3 65.7 0.23 4.55
République démocratique du Congo 201159.58 6.13 136.0 91.89 6.76 89.906890 -2.779337 526.318175 4.731963e+04 -1.624439 3.0 29.7 0.10 14.30
-----------------------------------------------------------------------------------------------------------------------
Prétraitement appliqué: Transformation logarithmique
No description has been provided for this image
Cluster 0: 47 Pays
Cluster 1: 35 Pays
Cluster 2: 26 Pays
Cluster 3: 45 Pays
Cluster 4: 29 Pays
Liste de Outliers
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Burundi 9068.87 2.09 0.0 0.00 100.00 11.874838 -1.717280 283.669870 3.368534e+03 -1.624993 2.3 41.0 0.06 10.70
Chine, continentale 33788758.93 65.11 795.0 3.83 100.11 1421.864031 2.424684 10043.130179 1.427997e+07 -0.259811 40.7 105.3 0.39 2.02
Inde 6054757.47 11.99 0.0 0.00 100.11 1383.112050 2.115564 2061.100834 2.850733e+06 -0.796841 15.3 65.7 0.23 4.55
République démocratique du Congo 201159.58 6.13 136.0 91.89 6.76 89.906890 -2.779337 526.318175 4.731963e+04 -1.624439 3.0 29.7 0.10 14.30
In [32]:
# CAH_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats CAH
Data_Log_CAH = CAH_Stats(DF_F,'Log', 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Kmeans_Stats(DF, scaler, Nombre de clusters)
# Affichage et Enregistrement des résultats Kmeans
Data_Log_Kmeans = Kmeans_Stats(DF_F,'Log', 5)
Prétraitement appliqué: Transformation logarithmique
Statistiques (moyennes) des clusters - CAH
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
cluster
1 9.284351 4.172110 2.031929 4.138021 2.203780 0.601399 0.623738 8.762388 8.016857 0.479380 3.548279 4.312279 0.395452 1.670357 1.0
2 11.468470 3.129018 3.791658 4.139268 3.456519 2.623110 0.944759 7.165539 9.665658 0.118936 2.775903 4.106537 0.234784 2.341675 2.0
3 12.047738 4.625705 3.735006 3.435467 4.227885 1.812270 0.780902 9.540302 10.954877 0.353228 3.805318 4.485396 0.410466 0.991415 3.0
4 14.808968 4.670219 5.386993 2.547573 4.572750 4.267737 0.782749 9.555824 13.804738 0.218931 3.876382 4.569735 0.406567 1.312912 4.0
5 12.533405 3.233776 0.792992 0.672868 4.629442 3.533641 0.844142 7.860345 11.344244 0.149956 3.081376 4.307756 0.269567 2.032052 5.0
Tendance des indicateurs par clusters - CAH
No description has been provided for this image
Imputation des clusters par pays - CAH
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
Pays
Afghanistan 11.456264 2.060514 3.806662 4.170843 3.727619 3.657634 0.095310 6.217649 9.847208 0.095310 2.397895 4.048301 0.165514 2.557227 2
Afrique du Sud 14.912899 4.958078 6.192362 3.153163 4.435330 4.079012 0.095310 8.808335 12.870131 0.095310 3.610918 4.390739 0.371564 1.601406 4
Albanie 10.804207 3.869742 3.135494 4.156693 3.641264 1.354257 1.004191 8.586764 9.642306 0.104405 4.110874 4.736198 0.425268 0.095310 3
Répartition des pays par cluster - CAH
Cluster 1: Nombre de Pays 35
Index(['Antigua-et-Barbuda', 'Bahamas', 'Bhoutan', 'Botswana', 'Burundi',
       'Cabo Verde', 'Chine - RAS de Macao', 'Comores', 'Congo', 'Dominique',
       'Eswatini', 'Gabon', 'Grenade', 'Guinée-Bissau', 'Islande', 'Kiribati',
       'Lesotho', 'Luxembourg', 'Macédoine du Nord', 'Malte',
       'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
       'Nouvelle-Calédonie', 'Polynésie française',
       'République centrafricaine', 'Saint-Kitts-et-Nevis',
       'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa',
       'Sao Tomé-et-Principe', 'Seychelles', 'Vanuatu', 'Îles Salomon'],
      dtype='object', name='Pays')
Cluster 2: Nombre de Pays 24
Index(['Afghanistan', 'Angola', 'Bénin', 'Gambie', 'Ghana', 'Guinée', 'Haïti',
       'Iraq', 'Kirghizistan', 'Libéria', 'Mauritanie', 'Mozambique',
       'Namibie', 'Ouzbékistan', 'Papouasie-Nouvelle-Guinée',
       'République arabe syrienne', 'République démocratique du Congo',
       'Sierra Leone', 'Tadjikistan', 'Timor-Leste', 'Togo', 'Turkménistan',
       'Yémen', 'Zambie'],
      dtype='object', name='Pays')
Cluster 3: Nombre de Pays 57
Index(['Albanie', 'Arménie', 'Autriche', 'Azerbaïdjan', 'Bahreïn', 'Barbade',
       'Belgique', 'Belize', 'Bosnie-Herzégovine', 'Bulgarie', 'Bélarus',
       'Chine - RAS de Hong-Kong', 'Chine, Taiwan Province de', 'Chypre',
       'Costa Rica', 'Croatie', 'Cuba', 'Danemark', 'El Salvador', 'Estonie',
       'Fidji', 'Finlande', 'Grèce', 'Guatemala', 'Guyana', 'Géorgie',
       'Honduras', 'Hongrie', 'Irlande', 'Jamaïque', 'Jordanie', 'Koweït',
       'Lettonie', 'Liban', 'Libye', 'Lituanie', 'Maurice', 'Nicaragua',
       'Oman', 'Panama', 'Pays-Bas', 'Portugal', 'Qatar', 'Roumanie',
       'République Tchèque', 'République de Moldova', 'République dominicaine',
       'Serbie', 'Slovaquie', 'Slovénie', 'Suisse', 'Suriname', 'Suède',
       'Trinité-et-Tobago', 'Uruguay',
       'Venezuela (République bolivarienne du)', 'Émirats arabes unis'],
      dtype='object', name='Pays')
Cluster 4: Nombre de Pays 25
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Canada', 'Chili',
       'Chine, continentale', 'Colombie', 'Espagne', 'France',
       'Fédération de Russie', 'Italie', 'Japon', 'Kazakhstan', 'Malaisie',
       'Mexique', 'Philippines', 'Pologne', 'Pérou', 'Royaume-Uni',
       'République de Corée', 'Turquie', 'Ukraine', 'Viet Nam', 'Égypte',
       'États-Unis d'Amérique'],
      dtype='object', name='Pays')
Cluster 5: Nombre de Pays 41
Index(['Algérie', 'Argentine', 'Australie', 'Bangladesh',
       'Bolivie (État plurinational de)', 'Brésil', 'Burkina Faso', 'Cambodge',
       'Cameroun', 'Côte d'Ivoire', 'Inde', 'Indonésie',
       'Iran (République islamique d')', 'Israël', 'Kenya', 'Madagascar',
       'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Niger', 'Nigéria', 'Norvège',
       'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
       'Rwanda', 'République démocratique populaire lao',
       'République-Unie de Tanzanie', 'Soudan', 'Soudan du Sud', 'Sri Lanka',
       'Sénégal', 'Tchad', 'Thaïlande', 'Tunisie', 'Zimbabwe', 'Équateur',
       'Éthiopie'],
      dtype='object', name='Pays')
-----------------------------------------------------------------------------------------------------------------------
Prétraitement appliqué: Transformation logarithmique
Statistiques (moyennes) des clusters - Kmeans
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
cluster
0 11.616754 4.665826 3.191040 3.371124 4.033830 1.459101 0.831929 9.410496 10.328334 0.335633 3.773720 4.474580 0.403276 1.149784 0.0
1 12.525204 3.190879 0.602488 0.430175 4.640607 3.562942 0.903228 7.677350 11.192972 0.114976 2.965763 4.259008 0.254062 2.019224 1.0
2 11.325661 2.871732 3.442934 3.909984 3.637848 2.735222 0.692754 7.009788 9.650434 0.121309 2.791817 4.115021 0.238832 2.389178 2.0
3 14.024303 4.605647 5.108406 3.039358 4.437731 3.581400 0.643124 9.806304 13.339747 0.324917 3.908578 4.568208 0.420407 1.186372 3.0
4 9.002758 4.180416 1.784126 4.115243 2.031409 0.459181 0.880316 8.589127 7.546227 0.476344 3.493819 4.278799 0.383259 1.623870 4.0
Tendance des indicateurs par clusters - Kmeans
No description has been provided for this image
Imputation des clusters par pays - KMeans
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop cluster
Pays
Afghanistan 11.456264 2.060514 3.806662 4.170843 3.727619 3.657634 0.095310 6.217649 9.847208 0.095310 2.397895 4.048301 0.165514 2.557227 2
Afrique du Sud 14.912899 4.958078 6.192362 3.153163 4.435330 4.079012 0.095310 8.808335 12.870131 0.095310 3.610918 4.390739 0.371564 1.601406 3
Albanie 10.804207 3.869742 3.135494 4.156693 3.641264 1.354257 1.004191 8.586764 9.642306 0.104405 4.110874 4.736198 0.425268 0.095310 0
Répartition des pays par cluster - KMeans
Cluster 0: Nombre de Pays 47
Index(['Albanie', 'Arménie', 'Azerbaïdjan', 'Bahamas', 'Bahreïn', 'Barbade',
       'Bosnie-Herzégovine', 'Bulgarie', 'Bélarus', 'Chine - RAS de Macao',
       'Chine, Taiwan Province de', 'Chypre', 'Costa Rica', 'Croatie',
       'El Salvador', 'Estonie', 'Fidji', 'Finlande', 'Gabon', 'Guyana',
       'Géorgie', 'Honduras', 'Islande', 'Jamaïque', 'Jordanie', 'Koweït',
       'Lettonie', 'Liban', 'Libye', 'Lituanie', 'Macédoine du Nord', 'Malte',
       'Maurice', 'Nicaragua', 'Norvège', 'Oman', 'Panama', 'Qatar',
       'République de Moldova', 'République dominicaine', 'Serbie',
       'Slovaquie', 'Slovénie', 'Suriname', 'Trinité-et-Tobago',
       'Turkménistan', 'Uruguay'],
      dtype='object', name='Pays')
Cluster 1: Nombre de Pays 35
Index(['Algérie', 'Argentine', 'Bangladesh', 'Bolivie (État plurinational de)',
       'Burkina Faso', 'Burundi', 'Cambodge', 'Cameroun', 'Côte d'Ivoire',
       'Inde', 'Indonésie', 'Iran (République islamique d')', 'Israël',
       'Kenya', 'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Nigéria',
       'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
       'Rwanda', 'Soudan', 'Soudan du Sud', 'Sri Lanka', 'Sénégal',
       'Thaïlande', 'Tunisie', 'Zimbabwe', 'Équateur', 'Éthiopie'],
      dtype='object', name='Pays')
Cluster 2: Nombre de Pays 26
Index(['Afghanistan', 'Angola', 'Bénin', 'Congo', 'Ghana', 'Guinée', 'Haïti',
       'Kirghizistan', 'Libéria', 'Mauritanie', 'Mozambique', 'Namibie',
       'Niger', 'Ouzbékistan', 'Papouasie-Nouvelle-Guinée',
       'République arabe syrienne', 'République centrafricaine',
       'République démocratique du Congo',
       'République démocratique populaire lao', 'République-Unie de Tanzanie',
       'Sierra Leone', 'Tadjikistan', 'Tchad', 'Togo', 'Yémen', 'Zambie'],
      dtype='object', name='Pays')
Cluster 3: Nombre de Pays 45
Index(['Afrique du Sud', 'Allemagne', 'Arabie saoudite', 'Australie',
       'Autriche', 'Belgique', 'Brésil', 'Canada', 'Chili',
       'Chine - RAS de Hong-Kong', 'Chine, continentale', 'Colombie', 'Cuba',
       'Danemark', 'Espagne', 'France', 'Fédération de Russie', 'Grèce',
       'Guatemala', 'Hongrie', 'Iraq', 'Irlande', 'Italie', 'Japon',
       'Kazakhstan', 'Malaisie', 'Mexique', 'Pays-Bas', 'Philippines',
       'Pologne', 'Portugal', 'Pérou', 'Roumanie', 'Royaume-Uni',
       'République Tchèque', 'République de Corée', 'Suisse', 'Suède',
       'Turquie', 'Ukraine', 'Venezuela (République bolivarienne du)',
       'Viet Nam', 'Égypte', 'Émirats arabes unis', 'États-Unis d'Amérique'],
      dtype='object', name='Pays')
Cluster 4: Nombre de Pays 29
Index(['Antigua-et-Barbuda', 'Belize', 'Bhoutan', 'Botswana', 'Cabo Verde',
       'Comores', 'Dominique', 'Eswatini', 'Gambie', 'Grenade',
       'Guinée-Bissau', 'Kiribati', 'Lesotho', 'Luxembourg',
       'Micronésie (États fédérés de)', 'Mongolie', 'Monténégro', 'Nauru',
       'Nouvelle-Calédonie', 'Polynésie française', 'Saint-Kitts-et-Nevis',
       'Saint-Vincent-et-les Grenadines', 'Sainte-Lucie', 'Samoa',
       'Sao Tomé-et-Principe', 'Seychelles', 'Timor-Leste', 'Vanuatu',
       'Îles Salomon'],
      dtype='object', name='Pays')

MinMaxScaler()

CAH(DF, scaler)¶

CAH(DF_F, MinMaxScaler()) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans(DF, scaler)¶

Kmeans(DF_F, MinMaxScaler())

CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶

CAH_groupes(DF_F, MinMaxScaler(), 5, 5) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶

Kmeans_Centroides(DF_F, MinMaxScaler(), 5, 5)

CAH_Stats(DF, scaler, Nombre de clusters)¶

Affichage et Enregistrement des résultats CAH¶

Data_MinMax_CAH = CAH_Stats(DF_F, MinMaxScaler(), 5) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Stats(DF, scaler, Nombre de clusters)¶

Affichage et Enregistrement des résultats Kmeans¶

Data_MinMax_Kmeans = Kmeans_Stats(DF_F, MinMaxScaler(), 5)

PowerTransformer()

CAH(DF, scaler)¶

CAH(DF_F, PowerTransformer(method='yeo-johnson')) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans(DF, scaler)¶

Kmeans(DF_F, PowerTransformer(method='yeo-johnson'))

CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶

CAH_groupes(DF_F, PowerTransformer(method='yeo-johnson'), 5, 4) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶

Kmeans_Centroides(DF_F, PowerTransformer(method='yeo-johnson'), 5, 4)

CAH_Stats(DF, scaler, Nombre de clusters)¶

Affichage et Enregistrement des résultats CAH¶

Data_Power_CAH = CAH_Stats(DF_F, PowerTransformer(method='yeo-johnson'), 5) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Stats(DF, scaler, Nombre de clusters)¶

Affichage et enregistrement des résultats Kmeans¶

Data_Power_Kmeans = Kmeans_Stats(DF_F, PowerTransformer(method='yeo-johnson'), 5)

Normalizer()

CAH(DF, scaler)¶

CAH(DF_F, Normalizer()) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans(DF, scaler)¶

Kmeans(DF_F, Normalizer())

CAH_groupes(DF, scaler, ombre de clusters, Seuil_Outliers)¶

CAH_groupes(DF_F, Normalizer(), 5, 5) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Centroides(DF, scaler, ombre de clusters, Seuil_Outliers)¶

Kmeans_Centroides(DF_F, Normalizer(), 5, 5)

CAH_Stats(DF, scaler, Nombre de clusters)¶

Affichage et Enregistrement des résultats CAH¶

Data_Norm_CAH = CAH_Stats(DF_F, Normalizer(), 5) print('-----------------------------------------------------------------------------------------------------------------------')

Kmeans_Stats(DF, scaler, Nombre de clusters)¶

Affichage et enregistrement des résultats Kmeans¶

Data_Norm_Kmeans = Kmeans_Stats(DF_F, Normalizer(), 5)

5 - Analyse en composantes principales (PCA)

Choix du DF pour l'ACP:¶

 Data_Scaler_CAH            Data_Log_CAH         Data_MinMax_CAH         Data_Power_CAH        Data_Norm_CAH
 Data_Scaler_Kmeans         Data_Log_Kmeans      Data_MinMax_Kmeans      Data_Power_Kmeans     Data_Norm_Kmeans

Le choix du prétraitement s'est porté sur la Transformation Logarithmique, complété par la méthode des K-means (Data_Log_Kmeans)¶

In [48]:
# Prise en compte du DF du prétraitement sélectionné
DF = Data_Log_Kmeans
# Séparation des Clusters du DF
Clusters = DF[['cluster']]
DF = DF.drop('cluster', axis=1)
In [49]:
# Split des données:
X = DF.values
names = DF.index
features = DF.columns

# Fit & transform
scaler = StandardScaler()
scaler.fit(X)
X_norm = scaler.transform(X)

# Réduction de dimensions avec PCA (utilisé pour la visualisation)
pca = PCA(n_components=5)
X_trans = pca.fit_transform(X)
# Transformer X_trans en np.array
X_ = np.array(X_trans)

# Aide au choix de n-components
pca = PCA().fit(X_norm)
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()
Text_message('Cumul des valeurs propres sur X_norm  : {}'.format(scree_cum))
Cumul des valeurs propres sur X_norm : [ 37. 63. 73. 81. 86. 90. 94. 96. 98. 99. 100. 100. 100. 100.]

Nombre de composantes principales à conserver lors de la réduction de dimensionnalité = 5

In [52]:
# PCA
n_components = 5

# Vérification moyennes à 0 et écarts type à 1 :
Text_message("Vérification moyennes à 0 et écarts type à 1")
idx = ["mean", "std"]
display(pd.DataFrame(X_norm).describe().round(2).loc[idx, :])

# On instancie notre ACP :
pca = PCA(n_components=n_components)
# On l'entraine sur les données scalées :
pca.fit(X_norm)

# Variable avec la liste de nos composantes :
x_list = range(1, n_components+1)

# Enregistrement dans une variable :
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()

# Affichage des graphiques
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.bar(x_list, scree, color=plt.cm.Blues(scree / max(scree)))
plt.plot(x_list, scree_cum, c="firebrick", marker='o')
plt.xlabel("Rang de l'axe d'inertie")
plt.ylabel("Pourcentage d'inertie")
plt.title("Eboulis des valeurs propres", color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
plt.subplot(1, 2, 2)
# PCA avec 10 components
pca1 = PCA(10).fit(X_norm)
# Calcul de la variance expliquée par composante
explained_variance = pca1.explained_variance_ratio_
# Création d'un graphique pour la méthode du coude
plt.plot(range(1, len(explained_variance) + 1), explained_variance, linestyle='-', c="firebrick", marker='o')
plt.xlabel('Nombre de composantes')
plt.ylabel('Variance expliquée')
plt.title('Variance expliquée par nombre de composantes\n Méthode du coude', color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
# Ajustement des ticks de l'axe des abscisses
plt.xticks(np.arange(1, len(explained_variance) + 1, 1))
plt.show()

# Affichage n-component retenu :
Text_message('La méthode du coude nous indique que {} composantes suffisent'.format(n_components))
Text_message('Cumul des valeurs propres : {}'.format(scree_cum))

# DF des composantes principales 
pcs = pca.components_
pcs = pd.DataFrame(pcs)
# Ajout des F :
pcs.columns = features
pcs.index = [f"F{i}" for i in x_list]
pcs.round(2)
Tmessage("Composantes principales")
display(pcs)


# Représentation graphique :
fig, ax = plt.subplots(figsize=(12, 3))
sns.heatmap(pcs.T, vmin=-1, vmax=1, annot=True, cmap="coolwarm", fmt="0.2f")
plt.title('Heatmap des composantes principales', color='firebrick', fontsize=14, fontweight='bold')
plt.show()
Vérification moyennes à 0 et écarts type à 1
0 1 2 3 4 5 6 7 8 9 10 11 12 13
mean 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.0 0.0 0.0 -0.0 -0.0 -0.0
std 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
No description has been provided for this image
La méthode du coude nous indique que 5 composantes suffisent
Cumul des valeurs propres : [37. 63. 73. 81. 86.]
Composantes principales
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
F1 -0.109035 -0.347413 -0.228116 -0.150594 0.017506 0.086700 0.063953 -0.403687 -0.167296 -0.259444 -0.414301 -0.349304 -0.401131 0.260690
F2 -0.478619 0.041260 -0.123821 0.319042 -0.381293 -0.479370 -0.006275 -0.019359 -0.449257 0.236869 0.003311 -0.111488 0.077628 0.010105
F3 0.147892 -0.018495 0.646400 0.537188 -0.287121 0.137757 -0.197125 -0.034475 0.117500 -0.116553 -0.151646 -0.200423 -0.106706 0.167262
F4 0.059849 0.057273 0.163323 0.125701 -0.087583 0.054226 0.851345 -0.133857 -0.098531 -0.178098 0.000760 -0.032429 0.000386 -0.393531
F5 -0.125363 -0.426469 -0.003080 0.114343 -0.033146 0.151246 0.401138 0.180493 0.214739 0.451366 0.042006 0.241965 -0.027796 0.510816
No description has been provided for this image
In [54]:
# Projection 
X_proj = pca.transform(X_norm)

# correlation_graph(pca, x_y, features, palette="rocket", legend_fontsize=12, label_fontsize=10, Indicsize=8, arrow_alpha=0.8):
# Afficher le cercle de corrélation pour F1 et F2
x_y = 0,1
correlation_graph(pca, (x_y), features, palette="viridis")  

# Plans_Factoriels(X_projected, x_y, clusters=None, alpha=1, figsize=[10,8], marker=".", palette='viridis')
Plans_Factoriels(X_proj, x_y, pca, clusters=Clusters['cluster'], figsize=(12,8), marker="o")

# Plans_Factoriels(X_projected, x_y, pca=None,labels=None, clusters=None,alpha=1, figsize=[10,8], marker=".", palette='viridis')
Plans_Factoriels(X_proj, x_y, pca, labels=names, clusters=Clusters['cluster'], palette='viridis', figsize=(20,16), marker="o")

#-----------------------------------------------------------------------------------------------------------------------

# Afficher le cercle de corrélation pour F3 et F4
x_y = 2,3
correlation_graph(pca, (x_y), features, palette="viridis") 

Plans_Factoriels(X_proj, x_y, pca, clusters=Clusters['cluster'], figsize=(10,5), marker="o")

Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(20,16), clusters=Clusters['cluster'],marker="o")
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
6 - Résultats et recommandations
In [57]:
# --------------------------------------------- Choix du/des Clusters ----------------------------------
# Si 2 clusters intéressants:
#CHOIX0 = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 0]
#CHOIX1 = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 2]
#CHOIX = pd.concat([CHOIX0, CHOIX1], ignore_index=False)
# Sinon 1 seul cluster :
CHOIX = Data_Log_Kmeans.loc[Data_Log_Kmeans['cluster'] == 3]

CHOIX = CHOIX.drop('cluster', axis=1)
display(CHOIX.shape)

# --------------------------------------------- Calcul du score par pays ----------------------------------
CHOIX['Score'] = round((CHOIX['Dispo Alim']+0.1 + CHOIX['Dispo Alim (p/j)']*0.7+  CHOIX['Importation Qté']*1.5 + CHOIX['TDI']*2
                + CHOIX['TAS']*0.5 + CHOIX['%Croiss_Pop']*1.3 + CHOIX['PiB croiss.Hab %']*1.4 + CHOIX['%Prot_animale']*2 +
                  CHOIX['Stabilité politique']*0.4 + CHOIX['Pop(Million)']*0.1),2)

CHOIX = CHOIX.sort_values(by=['Score'], ascending=False)
CHOIX = CHOIX.reset_index()

# --------------------------------------------- DF Selection ----------------------------------------------
# Vérification concordance Pays et ajout du code iso_a3 pour merge avec 'world'
Pays_Etalon = pd.read_csv('PAYS_ETALON150.csv', sep=';')
Pays_Etalon = Pays_Etalon.rename(columns={'Country_FR': 'Pays','Alpha-3 code':'iso_a3'})
Concordance_pays = {"Pays-Bas (Royaume des)": 'Pays-Bas'}
Pays_Etalon['Pays'] = Pays_Etalon['Pays'].replace(Concordance_pays)
CodePays = Pays_Etalon[['Country','Pays','iso_a3']]
Pays_absents(CHOIX,CodePays)
CHOIXF = pd.merge(CHOIX, CodePays, on=['Pays'], how ='left')
CHOIXF= CHOIXF[['Pays', 'iso_a3', 'Score']]

Infos_Sup = DF_F.copy()
Infos_Sup = Infos_Sup.reset_index()
Infos_Sup = Infos_Sup[['Pays', 'Pop(Million)', 'Stabilité politique']]
CHOIXF = CHOIXF.merge(Infos_Sup, how='left', left_on='Pays', right_on='Pays')
CHOIX = CHOIXF.copy()
Text_message("Dataframe de sélection")
display(CHOIXF.head(3))
(45, 14)
Pays Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop Score
0 Mexique 15.669432 4.947695 7.041412 3.240637 4.338075 4.836959 1.366921 9.22485 14.053748 0.095310 3.822098 4.525044 0.398776 1.631199 43.80
1 Japon 15.091932 4.370081 7.038784 3.823629 4.514479 4.842545 1.122358 10.61471 15.449313 0.702947 3.912023 4.480740 0.444686 0.095310 42.06
Pays absent:
[]
Dataframe de sélection
Pays iso_a3 Score Pop(Million) Stabilité politique
0 Mexique MEX 43.80 125.085311 -0.843629
1 Japon JPN 42.06 125.791677 1.019695
2 Arabie saoudite SAU 41.78 35.827362 -0.623456

Indicateurs filtres de sélection

In [65]:
Stabilite_mini = 0 # de -2 à 1.6
Score_mini = 10
Population_mini = 4 # en million

Selection = CHOIXF.copy()
# On conserve les pays avec un indice de stabilité politique > mini 
Selection = Selection.loc[Selection['Stabilité politique'] >= Stabilite_mini]
# On conserve les pays avec un score > mini
Selection = Selection.loc[Selection['Score'] >= Score_mini]
# On conserve les pays avec une population totale > mini millions
Selection = Selection.loc[Selection['Pop(Million)'] >= Population_mini]
#Selection = Selection.reset_index()
CHOIXF= Selection.copy()
Tmessage("Liste des pays retenus pour l'étude de marché")
Selection = Selection.sort_values(by='Score', ascending=False)
Selection.set_index('Pays', inplace=True)
display(Selection.round(2))

# ------------------------------------------ Visualisation --------------------------------------

# Charger le fichier GeoJSON
geojson_url = 'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
response = requests.get(geojson_url)
geojson_data = response.json()

# Fonction pour exclure un pays du GeoJSON
def filter_geojson(data, country_name_to_exclude):
    filtered_features = [
        feature for feature in data['features']
        if feature['properties']['name'] != country_name_to_exclude
    ]
    return {'type': 'FeatureCollection', 'features': filtered_features}

# Exclure l'Antarctique
geojson_data = filter_geojson(geojson_data, 'Antarctica')

# Reprise du DataFrame 
df = Selection

# Convertir le DataFrame en dictionnaire pour un accès facile
data_dict = df.set_index('iso_a3').to_dict(orient='index')

# Mise à jour du GeoJSON pour inclure les informations supplémentaires
for feature in geojson_data['features']:
    iso_a3 = feature['id']
    if iso_a3 in data_dict:
        feature['properties']['Score'] = data_dict[iso_a3]['Score']
        feature['properties']['Stabilité_politique'] = data_dict[iso_a3]['Stabilité politique']
        feature['properties']['Population_million'] = data_dict[iso_a3]['Pop(Million)']
    else:
        feature['properties']['Score'] = 'N/A'
        feature['properties']['Stabilité_politique'] = 'N/A'
        feature['properties']['Population_million'] = 'N/A'

# Créer une carte Folium
m = folium.Map(location=[30, 0], zoom_start=2, width='100%', height='500px')

# Définir les couleurs et les styles
highlight_color = 'viridis'
default_fill_color = 'lightgrey'
border_color = 'black'
border_weight = 1.2

# Fonction de style conditionnel
def style_function(feature):
    iso_a3 = feature['id']
    if iso_a3 in data_dict:
        return {
            'fillColor': highlight_color,
            'color': border_color,
            'weight': border_weight,
            'fillOpacity': 0.0
        }
    else:
        return {
            'fillColor': 'white',  # Couleur blanche pour les pays non sélectionnés
            'color': border_color,
            'weight': border_weight,
            'fillOpacity': 0.9
        }
        
# Ajouter un choropleth
folium.Choropleth(
    geo_data=geojson_data,
    data=df,
    columns=['iso_a3', 'Score'],
    key_on='feature.id',
    fill_color=highlight_color,
    fill_opacity=0.8,
    line_opacity=0.8,
    line_color=border_color,
    line_weight=border_weight,
    legend_name='Score par pays'
).add_to(m)

# Ajouter le GeoJson avec tooltips et styles conditionnels
folium.GeoJson(
    geojson_data,
    style_function=style_function,
    tooltip=folium.GeoJsonTooltip(
        fields=['name', 'Score', 'Stabilité_politique', 'Population_million'],  # Champs mis à jour
        aliases=['Country:', 'Score:', 'Stabilité politique:', 'Population (millions):'],
        localize=True,
        labels=True,
        sticky=True
    )
).add_to(m)

# Afficher la carte
sns.set(rc={'axes.facecolor':'white', 'figure.facecolor':'white'})
Tmessage('Carte du monde avec score par pays')

m
Liste des pays retenus pour l'étude de marché
iso_a3 Score Pop(Million) Stabilité politique
Pays
Japon JPN 42.06 125.79 1.02
Pays-Bas NLD 41.70 17.36 0.82
Royaume-Uni GBR 41.16 66.78 0.53
Allemagne DEU 40.73 83.15 0.55
Émirats arabes unis ARE 39.93 9.21 0.67
Belgique BEL 39.72 11.51 0.46
Viet Nam VNM 39.15 95.78 0.04
France FRA 39.09 64.40 0.27
Irlande IRL 38.96 4.90 0.96
Cuba CUB 38.53 11.32 0.61
Danemark DNK 37.65 5.80 0.97
Canada CAN 37.50 37.52 0.99
États-Unis d'Amérique USA 37.06 334.32 0.12
Roumanie ROU 36.62 19.52 0.54
Espagne ESP 36.28 47.13 0.29
Autriche AUT 36.27 8.88 0.89
République de Corée KOR 36.12 51.80 0.55
République Tchèque CZE 35.78 10.54 0.94
Suède SWE 35.25 10.27 1.01
Malaisie MYS 34.93 32.80 0.15
Hongrie HUN 34.87 9.77 0.76
Portugal PRT 34.07 10.29 1.05
Pologne POL 34.03 38.49 0.55
Suisse CHE 33.74 8.58 1.31
Grèce GRC 33.22 10.57 0.16
Italie ITA 32.58 59.73 0.38
Australie AUS 29.33 25.36 0.92
Carte du monde avec score par pays
Out[65]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Recommandations:¶

- Vérifier le niveau de coûts de production de volailles (Kg ou Tonne) par rapport à la France¶

- Vérifier auprès de la COFACE les informations économiques et sectorielles¶

- Les Pays ayant un score supérieur à 35 sont à privilégiér¶

- Pour les Pays musulmans -- Conformité/Certification produits Halal¶

- D'un point de vue écologique (Transport), privilégier les Pays Européens + Ireland¶

7 - Analyse ciblée/adaptée à la mission
7.1 - Choix des indicateurs
In [70]:
# Indicateurs présents dans la matrice de corrélation
Text_message('Indicateurs présents dans la matrice de corrélation')
display(DF_F.head(0))
# Préparation des indicateurs pour sélection finale
Text_message('Indicateurs non-prétraités pour sélection finale')
DF_Stab_Pop = DF_F[['Stabilité politique','Pop(Million)']]
display(DF_Stab_Pop.head(0))
# Choix des indicateurs non redondants:
Text_message("Indicateurs retenus pour l'analyse")
DF_Pro = DF_F[['Importation Qté', 'TDI', 'TAS', '%Croiss_Pop', 'PiB croiss.Hab %' ,'Moy_Prot' , '%Prot_animale']]
#DF_Pro = DF_F[['Dispo Alim (p/j)', 'TDI', 'TAS', '%Croiss_Pop', 'PiB croiss.Hab %' ,'Moy_Prot' , '%Prot_animale']]
DF_Pro.head(0)
Indicateurs présents dans la matrice de corrélation
Dispo Alim Dispo Alim (p/j) Importation Qté TDI TAS Pop(Million) PiB croiss.Hab % PIB Valeur Hab PIB Valeur Stabilité politique Moy_Prot_Animale Moy_Prot %Prot_animale %Croiss_Pop
Pays
Indicateurs non-prétraités pour sélection finale
Stabilité politique Pop(Million)
Pays
Indicateurs retenus pour l'analyse
Out[70]:
Importation Qté TDI TAS %Croiss_Pop PiB croiss.Hab % Moy_Prot %Prot_animale
Pays
7.2 - Choix du prétraitement et clustering CAH et K-means

Répartition des clusters suivant différents prétraitements. On cherche une répartition homogène qui minimise l'effet des outliers

In [76]:
# Boucle de prétraitement:
Tmessage("Observation de la ventilation des Pays avec 4 clusters")
pretraitements  = [preprocessing.StandardScaler(), 'Log', MinMaxScaler(), PowerTransformer(method='yeo-johnson'), Normalizer()]
for i in pretraitements :
    Clusterings(DF_Pro, i, 4)
Observation de la ventilation des Pays avec 4 clusters
Prétraitement appliqué: StandardScaler()
No description has been provided for this image
Prétraitement appliqué: Transformation logarithmique
No description has been provided for this image
Prétraitement appliqué: MinMaxScaler()
No description has been provided for this image
Prétraitement appliqué: PowerTransformer()
No description has been provided for this image
Prétraitement appliqué: Normalizer()
No description has been provided for this image

J'opte pour K-means(Log) / + Homogène

Choix prétraitement :¶

 - Methode = 'StandardScaler'  :                 scaler = preprocessing.StandardScaler() 
 - Methode = 'Transformation logarithmique' :    scaler = 'Log'
 - Methode = 'MinMaxScaler' :                    scaler = MinMaxScaler()    
 - Methode = 'Power Transformation' :            scaler = PowerTransformer(method='yeo-johnson')       
 - Methode = 'Normalizer' :                      scaler = Normalizer()    
In [80]:
# Confirmation du nombre de Clusters à prendre en compte sur le prétraitement choisi
print('-----------------------------------------------------------------------------------------------------------------------')
Kmeans(DF_Pro, 'Log')
print('-----------------------------------------------------------------------------------------------------------------------')
Tmessage("Pour notre analyse, nous avons besoin d'au moins 4 clusters pour obtenir des groupes bien distincts")
Tmessage("Je choisis 5 clusters (score plus élevé que 4)")
Clusterings(DF_Pro, 'Log', 5)
print('-----------------------------------------------------------------------------------------------------------------------')
# Tendances des indicateurs et répartition des groupes
DF_Cib = Kmeans_Stats(DF_Pro, 'Log', 5)
-----------------------------------------------------------------------------------------------------------------------
K-Means
Prétraitement appliqué: Transformation logarithmique
Méthode du coude et Scores de silhouette pour le choix du nombre de clusters
No description has been provided for this image
Nombre optimal de clusters conseillé: 2
-----------------------------------------------------------------------------------------------------------------------
Pour notre analyse, nous avons besoin d'au moins 4 clusters pour obtenir des groupes bien distincts
Je choisis 5 clusters (score plus élevé que 4)
Prétraitement appliqué: Transformation logarithmique
No description has been provided for this image
-----------------------------------------------------------------------------------------------------------------------
Prétraitement appliqué: Transformation logarithmique
Statistiques (moyennes) des clusters - Kmeans
Importation Qté TDI TAS %Croiss_Pop PiB croiss.Hab % Moy_Prot %Prot_animale cluster
cluster
0 2.920083 2.184894 4.594186 1.082976 1.210264 4.401141 0.356079 0.0
1 2.812986 4.580810 1.046495 1.656277 0.777775 4.245898 0.380191 1.0
2 5.314704 3.716771 4.181430 1.234972 0.557141 4.513597 0.401605 2.0
3 2.702625 4.013002 3.765479 1.858609 0.747724 4.325423 0.348891 3.0
4 0.609947 0.397817 4.649195 2.034258 0.775077 4.308673 0.277133 4.0
Tendance des indicateurs par clusters - Kmeans
No description has been provided for this image
Imputation des clusters par pays - KMeans
Importation Qté TDI TAS %Croiss_Pop PiB croiss.Hab % Moy_Prot %Prot_animale cluster
Pays
Afghanistan 3.806662 4.170843 3.727619 2.557227 0.095310 4.048301 0.165514 3
Afrique du Sud 6.192362 3.153163 4.435330 1.601406 0.095310 4.390739 0.371564 2
Albanie 3.135494 4.156693 3.641264 0.095310 1.004191 4.736198 0.425268 3
Répartition des pays par cluster - KMeans
Cluster 0: Nombre de Pays 31
Index(['Barbade', 'Bosnie-Herzégovine', 'Bélarus', 'Costa Rica', 'El Salvador',
       'Fidji', 'Finlande', 'Honduras', 'Jamaïque', 'Liban', 'Malaisie',
       'Maurice', 'Nicaragua', 'Nigéria', 'Ouzbékistan', 'Panama', 'Pologne',
       'Pérou', 'République arabe syrienne', 'République de Moldova',
       'République dominicaine', 'République démocratique populaire lao',
       'République-Unie de Tanzanie', 'Serbie', 'Soudan du Sud', 'Turquie',
       'Ukraine', 'Uruguay', 'Venezuela (République bolivarienne du)',
       'Égypte', 'États-Unis d'Amérique'],
      dtype='object', name='Pays')
Cluster 1: Nombre de Pays 22
Index(['Antigua-et-Barbuda', 'Cabo Verde', 'Congo', 'Dominique', 'Gabon',
       'Gambie', 'Haïti', 'Lesotho', 'Luxembourg', 'Macédoine du Nord',
       'Micronésie (États fédérés de)', 'Mongolie', 'Nauru',
       'Nouvelle-Calédonie', 'Oman', 'Polynésie française',
       'République démocratique du Congo', 'Saint-Kitts-et-Nevis',
       'Saint-Vincent-et-les Grenadines', 'Samoa', 'Timor-Leste',
       'Îles Salomon'],
      dtype='object', name='Pays')
Cluster 2: Nombre de Pays 47
Index(['Afrique du Sud', 'Allemagne', 'Angola', 'Arabie saoudite', 'Autriche',
       'Belgique', 'Bulgarie', 'Bénin', 'Canada', 'Chili',
       'Chine - RAS de Hong-Kong', 'Chine, Taiwan Province de',
       'Chine, continentale', 'Colombie', 'Cuba', 'Danemark', 'Espagne',
       'France', 'Fédération de Russie', 'Ghana', 'Grèce', 'Guatemala',
       'Géorgie', 'Hongrie', 'Iraq', 'Irlande', 'Italie', 'Japon',
       'Kazakhstan', 'Koweït', 'Lettonie', 'Libye', 'Lituanie', 'Mexique',
       'Pays-Bas', 'Philippines', 'Portugal', 'Qatar', 'Roumanie',
       'Royaume-Uni', 'République Tchèque', 'République de Corée', 'Slovaquie',
       'Suède', 'Viet Nam', 'Yémen', 'Émirats arabes unis'],
      dtype='object', name='Pays')
Cluster 3: Nombre de Pays 43
Index(['Afghanistan', 'Albanie', 'Arménie', 'Azerbaïdjan', 'Bahamas',
       'Bahreïn', 'Bhoutan', 'Botswana', 'Chine - RAS de Macao', 'Chypre',
       'Croatie', 'Estonie', 'Eswatini', 'Grenade', 'Guinée', 'Guinée-Bissau',
       'Islande', 'Jordanie', 'Kirghizistan', 'Kiribati', 'Libéria', 'Malte',
       'Mauritanie', 'Monténégro', 'Mozambique', 'Namibie', 'Niger',
       'Papouasie-Nouvelle-Guinée', 'République centrafricaine',
       'Sainte-Lucie', 'Sao Tomé-et-Principe', 'Seychelles', 'Sierra Leone',
       'Slovénie', 'Suisse', 'Suriname', 'Tadjikistan', 'Tchad', 'Togo',
       'Trinité-et-Tobago', 'Turkménistan', 'Vanuatu', 'Zambie'],
      dtype='object', name='Pays')
Cluster 4: Nombre de Pays 39
Index(['Algérie', 'Argentine', 'Australie', 'Bangladesh', 'Belize',
       'Bolivie (État plurinational de)', 'Brésil', 'Burkina Faso', 'Burundi',
       'Cambodge', 'Cameroun', 'Comores', 'Côte d'Ivoire', 'Guyana', 'Inde',
       'Indonésie', 'Iran (République islamique d')', 'Israël', 'Kenya',
       'Madagascar', 'Malawi', 'Mali', 'Maroc', 'Myanmar', 'Norvège',
       'Nouvelle-Zélande', 'Népal', 'Ouganda', 'Pakistan', 'Paraguay',
       'Rwanda', 'Soudan', 'Sri Lanka', 'Sénégal', 'Thaïlande', 'Tunisie',
       'Zimbabwe', 'Équateur', 'Éthiopie'],
      dtype='object', name='Pays')
7.3 - Analyse en Composantes Principales
In [83]:
# Séparation des données et des clusters
Clusters = DF_Cib[['cluster']]
DF_Cible = DF_Cib.drop('cluster', axis=1)
# Split de la table (Données, index/pays, nom colonnes):
X = DF_Cible.values
names = DF_Cible.index
features = DF_Cible.columns

# Prétraitement des données:
scaler = StandardScaler()
# On fit :
scaler.fit(X)
# On transforme :
X_scaled = scaler.transform(X)

# Vérification moyennes à 0 et écarts type à 1 :
idx = ["mean", "std"]

pd.DataFrame(X_scaled).describe().round(2).loc[idx, :]
Out[83]:
0 1 2 3 4 5 6
mean 0.0 0.0 0.0 -0.0 0.0 -0.0 -0.0
std 1.0 1.0 1.0 1.0 1.0 1.0 1.0
In [87]:
# Vérification moyennes à 0 et écarts type à 1 :
idx = ["mean", "std"]
pd.DataFrame(X_scaled).describe().round(2).loc[idx, :]

# PCA
n_components = 4
# On instancie notre ACP :
pca = PCA(n_components=n_components)
# On l'entraine sur les données scalées :
pca.fit(X_scaled)

# Enregistrement dans une variable :
scree = (pca.explained_variance_ratio_*100).round(2)
scree_cum = scree.cumsum().round()

# Variable avec la liste de nos composantes :
x_list = range(1, n_components+1)

# Affichage des graphiques avec subplot
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.bar(x_list, scree, color=plt.cm.Blues(scree / max(scree)))
plt.plot(x_list, scree_cum, c="firebrick", marker='o')
plt.xlabel("Rang de l'axe d'inertie")
plt.ylabel("Pourcentage d'inertie")
plt.title("Eboulis des valeurs propres", color='firebrick', fontsize=12, fontweight='bold')
plt.grid(color='gray', linestyle='--')

plt.subplot(1, 2, 2)
# PCA avec 10 components
pca1 = PCA(10).fit(X_norm)
# Calcul de la variance expliquée par composante
explained_variance = pca1.explained_variance_ratio_
# Création d'un graphique pour la méthode du coude
plt.plot(range(1, len(explained_variance) + 1), explained_variance, linestyle='-', c="firebrick", marker='o')
plt.xlabel('Nombre de composantes')
plt.ylabel('Variance expliquée')
plt.title('Variance expliquée par nombre de composantes\n Méthode du coude', color='firebrick', fontsize=10, fontweight='bold')
plt.grid(color='gray', linestyle='--')
# Ajustement des ticks de l'axe des abscisses
plt.xticks(np.arange(1, len(explained_variance) + 1, 1))
plt.show()

# Affichage n-component retenu :
Text_message('La méthode du coude nous indique que {} composantes suffisent'.format(n_components))
Text_message('Cumul des valeurs propres : {}'.format(scree_cum))

pcs = pca.components_
pcs = pd.DataFrame(pcs)
# Ajout des F :
pcs.columns = features
pcs.index = [f"F{i}" for i in x_list]
pcs.round(2)
pcs.T

# Représentation graphique :
fig, ax = plt.subplots(figsize=(16, 4))
sns.heatmap(pcs.T, vmin=-1, vmax=1, annot=True, cmap="coolwarm", fmt="0.2f")
plt.title("Heatmap des composantes principales", color='firebrick', fontsize=16, fontweight='bold')
plt.show()


# Projection 
X_proj = pca.transform(X_scaled)

X_ = np.array(X_proj)


# Afficher le cercle de corrélation pour F1 et F2
x_y = 0,1
correlation_graph(pca, (x_y), features, palette="rocket", legend_fontsize=10, label_fontsize=9)  

# Afficher la projection factorielle :
Plans_Factoriels(X_proj, x_y, clusters=Clusters['cluster'], figsize=(12,4), marker="o")

# Afficher les pays avec F1 et F2 :
Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(18,14), clusters=Clusters['cluster'], marker="o")


# Afficher le cercle de corrélation pour F3 et F4
x_y = 2,3 
correlation_graph(pca, (x_y), features, palette="rocket", legend_fontsize=10, label_fontsize=9)  

# Afficher la projection factorielle :
Plans_Factoriels(X_proj, x_y, clusters=Clusters['cluster'], figsize=(12,4), marker="o")

# Afficher les pays avec F2 et F3 :
Plans_Factoriels(X_proj, x_y, pca, labels=names, figsize=(18,14), clusters=Clusters['cluster'],marker="o")
No description has been provided for this image
La méthode du coude nous indique que 4 composantes suffisent
Cumul des valeurs propres : [35. 59. 74. 86.]
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image
7.4 - Résultats et recommandations
In [89]:
# --------------------------------------------- Choix du/des Clusters ----------------------------------
# Si 2 clusters intéressants:
    #CHOIX0 = DF_Pro_Kmeans.loc[DF_Pro_Kmeans['cluster'] == ]
    #CHOIX1 = DF_Pro_Kmeans.loc[DF_Pro_Kmeans['cluster'] == ]
    #CHOIX = pd.concat([CHOIX0, CHOIX1], ignore_index=False)
# Sinon 1 seul cluster :
CHOIX = DF_Cib.loc[DF_Cib['cluster'] == 2]
In [94]:
CHOIX = DF_Cib.loc[DF_Cib['cluster'] == 2]

# On définie les Seuils de sélection:
Indice_Stabilite_Politique_Min = -0.0
Population_Min_enMillions = 4
Score_Mini = 10

# -------------------------------- Calcul du score -------------------------
#CHOIX['Score'] = (CHOIX['Dispo Alim (p/j)'] + CHOIX['Dispo Alim (p/j)']*1.5 + CHOIX['TDI']*2 + CHOIX['TAS']*0.5 + 
                 # CHOIX['%Croiss_Pop']*1.5 + CHOIX['PiB croiss.Hab %'] + CHOIX['%Prot_animale']*2)

CHOIX['Score'] = (CHOIX['Importation Qté']*1.5 + CHOIX['TDI']*2 + CHOIX['TAS'] + CHOIX['%Croiss_Pop']*1.5 + 
                  CHOIX['PiB croiss.Hab %']*2 + CHOIX['%Prot_animale']*2)
CHOIX = CHOIX.sort_values(by=['Score'], ascending=False)

# --------------------------------- Ajout d'indicateurs de sélection ---------------
DF_StabPol = DF_F[['Pop(Million)', 'Stabilité politique']]
DF_StabPol = DF_StabPol.reset_index()
CHOIX = pd.merge(CHOIX, DF_StabPol, on='Pays', how='left')

# --------------------------------- Critères de sélection ---------------
# Suppression des Pays où l'indice de stabilité politique est inférieure au seuil
CHOIX = CHOIX.sort_values(by=['Stabilité politique'], ascending=False)
CHOIX = CHOIX.loc[CHOIX['Stabilité politique'] >= Indice_Stabilite_Politique_Min]
# Suppression des Pays où la population totale est inférieure au seuil en millions
CHOIX = CHOIX.loc[CHOIX['Pop(Million)'] >= Population_Min_enMillions]
# Sélection des pays ayant un score supérieur à Score_Mini
CHOIX = CHOIX.loc[CHOIX['Score'] >= Score_Mini]

# Ajout du code iso_a3
Pays_Etalon = pd.read_csv('PAYS_ETALON150.csv', sep=';')
Pays_Etalon = Pays_Etalon.rename(columns={'Country_FR': 'Pays','Alpha-3 code':'iso_a3'})
Concordance_pays = {"Pays-Bas (Royaume des)": 'Pays-Bas'}
Pays_Etalon['Pays'] = Pays_Etalon['Pays'].replace(Concordance_pays)
CodePays = Pays_Etalon[['Country','Pays','iso_a3']]
CHOIX = pd.merge(CHOIX, CodePays, on=['Pays'], how ='left')

# --------------------------------- Sélection des Pays ---------------
Selection_Pays = CHOIX[['Pays', 'iso_a3', 'Score', 'Stabilité politique', 'Pop(Million)']]
Selection_Pays = Selection_Pays.sort_values(by='Score', ascending=False)
Selection_Pays.set_index('Pays', inplace=True)
# Affichage:
Tmessage("Pays sélectionnés pour l'étude de marché")
display(Selection_Pays.round(2))


# Charger le fichier GeoJSON
geojson_url = 'https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json'
response = requests.get(geojson_url)
geojson_data = response.json()

# Fonction pour exclure un pays du GeoJSON
def filter_geojson(data, country_name_to_exclude):
    filtered_features = [
        feature for feature in data['features']
        if feature['properties']['name'] != country_name_to_exclude
    ]
    return {'type': 'FeatureCollection', 'features': filtered_features}

# Exclure l'Antarctique
geojson_data = filter_geojson(geojson_data, 'Antarctica')

# Reprise du DataFrame 
df = Selection_Pays

# Convertir le DataFrame en dictionnaire pour un accès facile
data_dict = df.set_index('iso_a3').to_dict(orient='index')

# Mise à jour du GeoJSON pour inclure les informations supplémentaires
for feature in geojson_data['features']:
    iso_a3 = feature['id']
    if iso_a3 in data_dict:
        feature['properties']['Score'] = data_dict[iso_a3]['Score']
        feature['properties']['Stabilité_politique'] = data_dict[iso_a3]['Stabilité politique']
        feature['properties']['Population_million'] = data_dict[iso_a3]['Pop(Million)']
    else:
        feature['properties']['Score'] = 'N/A'
        feature['properties']['Stabilité_politique'] = 'N/A'
        feature['properties']['Population_million'] = 'N/A'

# Créer une carte Folium
m = folium.Map(location=[30, 0], zoom_start=2, width='100%', height='500px')

# Définir les couleurs et les styles
highlight_color = 'viridis'
default_fill_color = 'lightgrey'
border_color = 'black'
border_weight = 1.2

# Fonction de style conditionnel
def style_function(feature):
    iso_a3 = feature['id']
    if iso_a3 in data_dict:
        return {
            'fillColor': highlight_color,
            'color': border_color,
            'weight': border_weight,
            'fillOpacity': 0.0
        }
    else:
        return {
            'fillColor': 'white',  # Couleur blanche pour les pays non sélectionnés
            'color': border_color,
            'weight': border_weight,
            'fillOpacity': 0.9
        }
        
# Ajouter un choropleth
folium.Choropleth(
    geo_data=geojson_data,
    data=df,
    columns=['iso_a3', 'Score'],
    key_on='feature.id',
    fill_color=highlight_color,
    fill_opacity=0.8,
    line_opacity=0.8,
    line_color=border_color,
    line_weight=border_weight,
    legend_name='Score par pays'
).add_to(m)

# Ajouter le GeoJson avec tooltips et styles conditionnels
folium.GeoJson(
    geojson_data,
    style_function=style_function,
    tooltip=folium.GeoJsonTooltip(
        fields=['name', 'Score', 'Stabilité_politique', 'Population_million'],  # Champs mis à jour
        aliases=['Country:', 'Score:', 'Stabilité politique:', 'Population (millions):'],
        localize=True,
        labels=True,
        sticky=True
    )
).add_to(m)

# Afficher la carte
sns.set(rc={'axes.facecolor':'white', 'figure.facecolor':'white'})
Tmessage('Carte du monde avec score par pays')

m
Pays sélectionnés pour l'étude de marché
iso_a3 Score Stabilité politique Pop(Million)
Pays
Pays-Bas NLD 30.70 0.82 17.36
Belgique BEL 27.36 0.46 11.51
Chine, Taiwan Province de TWN 26.14 0.79 23.78
Japon JPN 26.00 1.02 125.79
Irlande IRL 25.72 0.96 4.90
Allemagne DEU 25.14 0.55 83.15
Viet Nam VNM 25.02 0.04 95.78
Koweït KWT 24.61 0.18 4.44
Royaume-Uni GBR 24.56 0.53 66.78
Émirats arabes unis ARE 24.34 0.67 9.21
Bulgarie BGR 24.28 0.56 7.05
Danemark DNK 24.22 0.97 5.80
Cuba CUB 23.82 0.61 11.32
Ghana GHA 23.62 0.12 31.52
Autriche AUT 23.21 0.89 8.88
France FRA 23.04 0.27 64.40
Roumanie ROU 22.77 0.54 19.52
République Tchèque CZE 21.90 0.94 10.54
Suède SWE 21.88 1.01 10.27
Slovaquie SVK 21.85 0.67 5.45
Canada CAN 21.41 0.99 37.52
Hongrie HUN 21.39 0.76 9.77
République de Corée KOR 20.59 0.55 51.80
Espagne ESP 20.32 0.29 47.13
Portugal PRT 19.52 1.05 10.29
Grèce GRC 19.09 0.16 10.57
Italie ITA 17.12 0.38 59.73
Carte du monde avec score par pays
Out[94]:
Make this Notebook Trusted to load map: File -> Trust Notebook

Recommandations:¶

- Vérifier le niveau de coûts de production de volailles (Kg ou Tonne) par rapport à la France¶

- Vérifier auprès de la COFACE les informations économiques et sectorielles¶

- Les Pays ayant un score supérieur à 24 sont à privilégiér (Allemagne, Belgique, Irelande, Pays-Bas, UK - Japon, Taïwan et Viet Nam)¶

- D'un point de vue écologique (Transport), privilégier les Pays Européens + UK¶

Vérification des résultats par une étude existante

EvolExp